package rhplus.utilizador;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import rhplus.acessoBD.PMF;

@PersistenceCapable
public class DoencaPassada implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id_doenca_passada;
    @Persistent
    private String doenca_generica;
    @Persistent
    private Long id_pessoa;
    @Persistent
    private Date data;
    @Persistent
    private String sintomas;
    @Persistent
    private String tratamento;

    /** Creates a new instance of DoencaPassada */
    public DoencaPassada(String dg, final Long id_pessoa, final Date data, final String sintomas,
            final String tratamento) {

        this.doenca_generica = dg;
        this.id_pessoa = id_pessoa;
        this.data = data;
        this.sintomas = sintomas;
        this.tratamento = tratamento;
    }

    public Long getIdDoencaPassada() {
        return id_doenca_passada;
    }

    public String getDoencaGenerica() {
        return doenca_generica;
    }

    public Long getIdPessoa() {
        return id_pessoa;
    }

    public Date getData() {
        return data;
    }

    public void setData(final Date data) {
        this.data = data;
    }

    public String getSintomas() {
        return sintomas;
    }

    public void setSintomas(final String sintomas) {
        this.sintomas = sintomas;
    }

    public String getTratamento() {
        return tratamento;
    }

    public void setTratamento(final String tratamento) {
        this.tratamento = tratamento;
    }

    public void setIdPessoa(final Long id) {
        this.id_pessoa = id;
    }

    public static DoencaPassada devolve(final Long id_doenca_passada) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + DoencaPassada.class.getName()
                + " where id_doenca_passada == " + id_doenca_passada;

        DoencaPassada doenca_passada = ((List<DoencaPassada>) pm.newQuery(query).execute()).get(0);

        return doenca_passada;

    }

    public static LinkedList<DoencaPassada> devolvePorIdPessoa(final Long id_pessoa) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + DoencaPassada.class.getName()
                + " where id_pessoa == " + id_pessoa;

        List<DoencaPassada> doenca_passada = (List<DoencaPassada>) pm.newQuery(query).execute();

        LinkedList<DoencaPassada> lista = new LinkedList<DoencaPassada>();

        for(DoencaPassada d : doenca_passada){
            lista.add(d);
        }

        
        return lista;
    }

    public static List<DoencaPassada> devolveTodas() throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + DoencaPassada.class.getName();

        List<DoencaPassada> lista_de_doencas_passadas = (List<DoencaPassada>) pm.newQuery(query).execute();


        return lista_de_doencas_passadas;
    }

    public static List<DoencaPassada> devolveTodasDoUtente(final Long id_pessoa) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + DoencaPassada.class.getName()
                + " where id_pessoa == " + id_pessoa;

        List<DoencaPassada> lista_de_doencas_passadas = (List<DoencaPassada>) pm.newQuery(query).execute();


        return lista_de_doencas_passadas;
    }

    //verificar método
    /*public static List<DoencaPassada> devolveTodasDoMesmoTipo(final Long id_doenca_generica) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select * from " + DoencaPassada.class.getName()
                + " where id_doenca_generica == " + id_doenca_generica;

        List<DoencaPassada> lista_de_doencas_passadas = (List<DoencaPassada>) pm.newQuery(query).execute();


        return lista_de_doencas_passadas;
    }*/

    public static void insere(final DoencaPassada doenca_passada) {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            pm.makePersistent(doenca_passada);
        } finally {
            pm.close();
        }
    }

    public static void altera(DoencaPassada doenca_passada) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String sintomas = doenca_passada.getSintomas();
        String tratamento = doenca_passada.getTratamento();
        Date data = (Date) doenca_passada.getData();
        try {
            pm.currentTransaction().begin();

            doenca_passada = pm.getObjectById(DoencaPassada.class, doenca_passada.getIdDoencaPassada());

            doenca_passada.setSintomas(sintomas);
            doenca_passada.setTratamento(tratamento);
            doenca_passada.setData(data);

            pm.makePersistent(doenca_passada);
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static void remove(final Long id_doenca_passada) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            pm.currentTransaction().begin();

            DoencaPassada doenca_passada = pm.getObjectById(DoencaPassada.class, id_doenca_passada);
            pm.deletePersistent(doenca_passada);

            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

//    public boolean equals(final Long id_doenca_passada) {
//        return this.getIdDoencaGenerica() == id_doenca_passada;
//    }

    @Override
    public String toString() {
        return id_doenca_passada + ";" + doenca_generica + ";" + id_pessoa + ";" + sintomas + ";" + tratamento + ";" + data + ";";
    }

    public void setIdDoenca(Long id_doenca_passada) {
        this.id_doenca_passada = id_doenca_passada;
    }
}
